package threads;

import java.util.concurrent.TimeUnit;

/**
 * volatile 关键字是保持变量线程可见性。 同时 volatile 还可以防止指令重排。
 *
 * 没有使用 volatile 修饰时： 在此示例中 run 的变量分别存储在公共内存及线程私有内存中，
 *      执行 run = false; 修改的是公共内存中的变量；
 *      而 while (run) 读取的一直时线程私有内存中的 run, 因此一直处于死循环的状态。
 *      根本原因就是线程私有内存和公共内存中的值不同步造成的，可以通过使用 volatile 关键字解决，
 *      volatile 的主要作用是当线程访问 run 变量时，强制地从公共内存中取值。
 */
public class VolatileDemo {
    //    private static volatile boolean run = true;
    private static boolean run = true;

    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            while (run) {
            }

            System.out.println("子线程执行结束");
        }).start();

        TimeUnit.SECONDS.sleep(1);

        System.out.println("终止子线程的执行");
        run = false;
    }
}
